package com.bj.common.util;

import java.security.MessageDigest;

import org.springframework.stereotype.Component;

/**
 * 多层md5加密算法类
 * 
 * @author pengbinxuan
 */
@Component("encryptUtil")
public class EncryptUtil
{
	// 持有一个MD5正则表达式类
	private RegexUtil regexUtil = new RegexUtil();

	/**
	 * md5算法类
	 * 
	 * @param str
	 * @return
	 */
	public String md5(String str)
	{
		char hexDigits[] =
		{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
		try
		{
			byte[] btInput = str.getBytes();
			// 获得MD5摘要算法的 MessageDigest 对象
			MessageDigest mdInst = MessageDigest.getInstance("MD5");
			// 使用指定的字节更新摘要
			mdInst.update(btInput);
			// 获得密文
			byte[] md = mdInst.digest();
			// 把密文转换成十六进制的字符串形式
			int j = md.length;
			char s[] = new char[j * 2];
			int k = 0;
			for (int i = 0; i < j; i++)
			{
				byte byte0 = md[i];
				s[k++] = hexDigits[byte0 >>> 4 & 0xf];
				s[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(s);
		} catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 生成一个随机MD5数
	 * 
	 * @param password
	 * @return 拼接MD5随机数和该数加密的MD5算法结果数的结果
	 */
	public String encryString(String password)
	{
		// 创建一个32位的加密码
		String encryStr = this.regexUtil.randString(32);
		// 拼接$md5$
		String md5Str = encryStr + "$md5$";
		// 用32位随机数和$md5$+密码拼装
		String str = this.md5(md5Str + password);
		// 返回一个结果后面的
		return md5Str + str;
	}

	/**
	 * 判断密码是否一致
	 * 
	 * @param password
	 *            明文密码
	 * @param encry
	 *            加密后的密码
	 * @return
	 */
	public boolean checkedPassword(String password, String encry)
	{
		// 判断密码中是否$
		if (encry.indexOf("$") == -1)
		{
			return false;
		}

		String[] encryStr = encry.split("//$");
		// 匹配
		String matchStr = encryStr[0] + "$" + encryStr[1] + "$" + password;
		matchStr = encryStr[0] + "$" + encryStr[1] + "$" + this.md5(matchStr);
		return matchStr.equalsIgnoreCase(encry);
	}
	
	public static void main(String[] args)
	{
		EncryptUtil encryptUtil = new EncryptUtil();
		System.out.println("---" + encryptUtil.md5("111111"));
		System.out.println(encryptUtil.encryString("111111"));
		String souStr = "M7c1v2IkHCxlaTGmgkhyYmvOgmRZPDzf$MD5$7F03227493430FBF835714D19BC44145" ; 
		String pass = "111211" ; 
		System.out.println(encryptUtil.checkedPassword(pass, souStr));
	}

}
